probabilistic programming primer